#include "c.h"
#include "assert.h"

void recortar
(
	Uint8* sprite,
	Uint32 numero_instancia,
	Uint32 ancho_instancia,
	Uint32 ancho_sprite,
	Uint32 alto_sprite,
	Uint8* instancia,
	bool orientacion
){
	//Alineamos el ancho del sprite a 4 bytes
	Uint32 ancho_sprite_bytes = (Uint32)(ancho_sprite * 3);
	Uint32 resto = ancho_sprite_bytes % 4;
	if(resto != 0) ancho_sprite_bytes += 4 - resto;
	assert(ancho_sprite_bytes % 4 == 0);

	Uint32 ancho_instancia_bytes = (Uint32)(ancho_instancia * 3);
	Uint32 bytes_hasta_primer_columna = (Uint32)(ancho_instancia_bytes * numero_instancia);

	Uint8* p_fila = sprite + bytes_hasta_primer_columna;
	Uint8* p_columna;
	Uint8* p_instancia = instancia;
	
	Uint32 partes = ancho_instancia_bytes / 16;

	for(Uint32 fila = 0; fila < alto_sprite; fila++)
	{
		Uint32 columna = 0;
		
		p_columna = p_fila;
		
		if(!orientacion)
		{
			p_columna += (ancho_instancia_bytes - 3);
		}
		else 
		{
			for(Uint32 parte = 0; parte < partes; parte++)
			{
				for(Uint32 byte_parte = 0; byte_parte < 16; byte_parte++)
				{
					*p_instancia = *p_columna;
					p_instancia++;
					p_columna++;
				}
				
				p_instancia--;
				p_columna--;
				columna+= 5;
			}
		}

		for(; columna < ancho_instancia; columna++)
		{
			for(Uint32 pixel = 0; pixel < 3; pixel++)
			{
				*p_instancia = *p_columna;
				p_instancia++;
				p_columna++;
			}

			if(!orientacion) p_columna -= 6;
		}

		//Alineamos el ancho de la instancia a 4 bytes
		resto = ancho_instancia_bytes % 4;
		if(resto != 0) p_instancia += 4 - resto;
		assert((ancho_instancia_bytes + (4 - resto)) % 4 == 0);
		
		p_fila += ancho_sprite_bytes;
	}
}
